/**
 * 微信JSSDK调试助手
 * 用于诊断和修复微信JSSDK加载和初始化问题
 */

/**
 * 检查wx对象是否正确加载
 * @returns {Object} 检查结果
 */
function checkWxObject() {
  const result = {
    exists: typeof wx !== 'undefined',
    hasConfig: false,
    hasReady: false,
    hasError: false,
    details: {}
  };
  
  if (result.exists) {
    // 检查wx对象属性
    result.hasConfig = typeof wx.config === 'function';
    result.hasReady = typeof wx.ready === 'function';
    result.hasError = typeof wx.error === 'function';
    
    // 记录wx对象有哪些方法（用于诊断）
    result.details.methods = [];
    for (const key in wx) {
      if (typeof wx[key] === 'function') {
        result.details.methods.push(key);
      }
    }
    
    // 判断是否是模拟的wx对象
    result.isMock = window.wx._isMockObject || 
                    (result.details.methods.length < 5) || 
                    (typeof wx._jWeixin === 'undefined');
  }
  
  return result;
}

/**
 * 强制重新加载微信JSSDK脚本
 * @returns {Promise} 加载结果的Promise
 */
function forceReloadJssdk() {
  return new Promise((resolve, reject) => {
    console.log('强制重新加载微信JSSDK脚本...');
    
    // 移除可能存在的旧脚本
    const oldScripts = document.querySelectorAll('script[src*="jweixin"]');
    oldScripts.forEach(script => {
      script.parentNode.removeChild(script);
    });
    
    // 清除可能存在的wx对象
    if (typeof wx !== 'undefined') {
      console.log('重置现有wx对象');
      window.wx = undefined;
    }
    
    // 创建新的script元素
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js'; // 使用主要CDN
    
    // 加载成功回调
    script.onload = () => {
      console.log('JSSDK脚本重新加载成功');
      
      // 检查加载后的wx对象
      const checkResult = checkWxObject();
      if (checkResult.exists && checkResult.hasConfig) {
        resolve({ success: true, wx: window.wx });
      } else {
        reject(new Error('JSSDK脚本加载成功，但wx对象不完整'));
      }
    };
    
    // 加载失败回调
    script.onerror = (error) => {
      console.error('JSSDK脚本重新加载失败:', error);
      reject(error);
    };
    
    // 添加到页面
    document.head.appendChild(script);
  });
}

/**
 * 修复wx对象（如果不完整）
 */
async function fixWxObject() {
  // 检查wx对象状态
  const checkResult = checkWxObject();
  console.log('wx对象检查结果:', checkResult);
  
  if (!checkResult.exists || !checkResult.hasConfig) {
    try {
      // 强制重新加载JSSDK
      await forceReloadJssdk();
      console.log('wx对象已修复');
      return { success: true, message: 'JSSDK已重新加载' };
    } catch (error) {
      console.error('修复wx对象失败:', error);
      return { success: false, message: '修复失败: ' + error.message };
    }
  } else if (checkResult.isMock) {
    console.log('检测到模拟的wx对象，将尝试替换为真实JSSDK');
    try {
      // 强制重新加载JSSDK
      await forceReloadJssdk();
      return { success: true, message: '模拟wx对象已替换为真实JSSDK' };
    } catch (error) {
      console.error('替换模拟wx对象失败:', error);
      return { success: false, message: '替换模拟对象失败: ' + error.message };
    }
  } else {
    return { success: true, message: 'wx对象正常，无需修复' };
  }
}

/**
 * 安全配置JSSDK
 * @param {Object} config - 配置参数
 * @returns {Promise} 配置结果的Promise
 */
function safeConfigJssdk(config) {
  return new Promise(async (resolve, reject) => {
    try {
      // 先检查wx对象
      const checkResult = checkWxObject();
      
      // 如果wx对象不存在或不完整，尝试修复
      if (!checkResult.exists || !checkResult.hasConfig) {
        const fixResult = await fixWxObject();
        if (!fixResult.success) {
          reject(new Error('无法修复wx对象: ' + fixResult.message));
          return;
        }
      }
      
      // 添加超时处理
      const timeoutId = setTimeout(() => {
        reject(new Error('配置超时，未收到ready或error回调'));
      }, 10000);
      
      // 设置ready回调
      wx.ready(() => {
        clearTimeout(timeoutId);
        resolve({ success: true, message: 'JSSDK配置成功' });
      });
      
      // 设置error回调
      wx.error((error) => {
        clearTimeout(timeoutId);
        reject(new Error('JSSDK配置错误: ' + (error.errMsg || JSON.stringify(error))));
      });
      
      // 调用config方法
      console.log('调用wx.config，参数:', config);
      wx.config(config);
    } catch (error) {
      reject(new Error('配置过程异常: ' + error.message));
    }
  });
}

/**
 * 直接在控制台执行的调试功能
 */
function exposeToConsole() {
  // 将工具暴露到全局对象，方便在控制台调试
  window.__wxSdkDebugger = {
    checkWxObject,
    forceReloadJssdk,
    fixWxObject,
    safeConfigJssdk
  };
  
  console.log('微信JSSDK调试助手已安装，可以在控制台通过 __wxSdkDebugger 访问');
}

// 导出函数
module.exports = {
  checkWxObject,
  forceReloadJssdk,
  fixWxObject,
  safeConfigJssdk,
  exposeToConsole
}; 